package pokestar;

import comunicacao.Logout;
import java.io.IOException;
import java.net.SocketException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import objectos.Objecto;
import objectos.Pokemon;
import objectos.TipoObjecto;
import objectos.Treinador;
import objectos.Vazio;
import pokestar.PokeStar.Jogador;

/**
 * @author igo
 * Classe Alive
 * Classe que verifica o mapa em busca de personagens que já tenham morrido.
 * Caso uma personagem tenha morrido (vida igual ou inferior a 0) substitui por um Objecto Vazio.
 * Caso seja o Treinador de um jogador a morrer, os Pokemons desse mesmo jogador desaparecem e é enviada uma mensagem de Derrota.
 */
public class Alive extends Thread{
    private Objecto[][] m;
    private LinkedList<Jogador> jogadores;
    
    public Alive(Objecto[][] m, LinkedList<Jogador> j){
        this.m = m;
        this.jogadores = j;
    }
    
    public synchronized void run(){
        try {
            while(!interrupted() && jogadores.size()>1){
                for(int l=0; l<m.length; l++)
                    for(int c=0; c<m[l].length; c++)
                        if(m[l][c].getTipo()==TipoObjecto.POKEMON){
                            if(((Pokemon)m[l][c]).getVida()<=0){
                                ((Pokemon)m[l][c]).Morreu();
                                m[l][c] = new Vazio();
                            }
                        }else if(m[l][c].getTipo() == TipoObjecto.TREINADOR){
                            if(((Treinador)m[l][c]).getVida()<=0){
                                ((Treinador)m[l][c]).Morreu();
                                String TDono = ((Treinador)m[l][c]).getInfo();
                                m[l][c] = new Vazio();
                                
                                for(int nl=0; nl<m.length; nl++)
                                    for(int nc=0; nc<m[nl].length; nc++)
                                        if(m[nl][nc].getTipo() == TipoObjecto.POKEMON)
                                            if(((Pokemon)m[nl][nc]).getDono().equals(TDono)){
                                                ((Pokemon) m[nl][nc]).Morreu();
                                                m[nl][nc] = new Vazio();
                                            }
                                
                                for(int j=0;j<jogadores.size();j++){
                                    if(jogadores.get(j).getNick().equals(TDono) && jogadores.get(j).eHumano()){
                                        try {
                                            jogadores.get(j).setStatus(false);
                                            jogadores.get(j).getOut().writeObject(new Logout("PERDESTE!"));
                                        } catch (SocketException ex){
                                            this.interrupt();
                                        } catch (IOException ex) {
                                            Logger.getLogger(Alive.class.getName()).log(Level.SEVERE, null, ex);
                                        }
                                    }
                                }
                            }
                        }
                sleep(200);
            }
        } catch (InterruptedException ex) {
            //Logger.getLogger(Alive.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}